(function ($) {
	$.fn.slides=function (option) {
		option=$.extend({
		},$.fn.slides.option,option);
		return this.each(function () {
			$('.'+option.container,$(this)).children().wrapAll('<div class="slides_control"/>');
			var elem=$(this),control=$('.slides_control',elem),total=control.children().size(),width=control.children().outerWidth(),height=control.children().outerHeight(),start=option.start-1,effect=option.effect.indexOf(',')<0?option.effect:option.effect.replace(' ','').split(',')[0],paginationEffect=option.effect.indexOf(',')<0?effect:option.effect.replace(' ','').split(',')[1],next=0,prev=0,number=0,current=0,loaded,active,clicked,position,direction;
			if(total<2) {
				return ;
			}
			if(start<0) {
				start=0;
			};
			if(start>total) {
				start=total-1;
			};
			if(option.start) {
				current=start;
			};
			if(option.randomize) {
				control.randomize();
			}
			$('.'+option.container,elem).css({
				overflow:'hidden',position:'relative'
			});
			control.css({
				position:'relative',width:(width*1),height:height,left:-width
			});
			control.children().css({
				position:'absolute',top:0,left:width,zIndex:0,display:'none'
			});
			if(option.autoHeight) {
				control.animate({
					height:control.children(':eq('+start+')').outerHeight()
				},option.autoHeightSpeed);
			}
			if(option.preload&&control.children()[0].tagName=='IMG') {
				elem.css({
					background:'url('+option.preloadImage+') no-repeat 50% 50%'
				});
				var img=$('img:eq('+start+')',elem).attr('src')+'?'+(new Date()).getTime();
				$('img:eq('+start+')',elem).attr('src',img).load(function () {
					$(this).fadeIn(option.fadeSpeed,function () {
						$(this).css({
							zIndex:5
						});
						elem.css({
							background:''
						});
						loaded=true;
					});
				});
			}else {
				control.children(':eq('+start+')').fadeIn(option.fadeSpeed,function () {
					loaded=true;
				});
			}
			if(option.bigTarget) {
				control.children().css({
					cursor:'pointer'
				});
				control.children().click(function () {
					animate('next',effect);
					return false;
				});
			}
			if(option.hoverPause&&option.play) {
				control.children().bind('mouseover',function () {
					stop();
				});
				control.children().bind('mouseleave',function () {
					pause();
				});
			}
			if(option.generateNextPrev) {
				$('.'+option.container,elem).after('<a href="#" class="'+option.prev+'">Prev</a>');
				$('.'+option.prev,elem).after('<a href="#" class="'+option.next+'">Next</a>');
			}
			$('.'+option.next,elem).click(function (e) {
				e.preventDefault();
				if(option.play) {
					pause();
				};
				animate('next',effect);
			});
			$('.'+option.prev,elem).click(function (e) {
				e.preventDefault();
				if(option.play) {
					pause();
				};
				animate('prev',effect);
			});
			if(option.generatePagination) {
				elem.append('<table class='+option.paginationClass+'></table>');
				control.children().each(function () {
					$('.'+option.paginationClass,elem).append('<td><a rel='+number+' href="#">'+(number+1)+'</a></td>');
					number++;
				});
			}else {
				$('.'+option.paginationClass+' td a',elem).each(function () {
					$(this).attr('rel',number);
					number++;
				});
			}
			$('.'+option.paginationClass+' td a:eq('+start+')',elem).parent().addClass('on');
			$('.'+option.paginationClass+' td a',elem).click(function () {
				if(option.play) {
					pause();
				};
				clicked=$(this).attr('rel');
				if(current!=clicked) {
					animate('pagination',paginationEffect,clicked);
				}
				return false;
			});
			if(option.play) {
				playInterval=setInterval(function () {
					animate('next',effect);
				},option.play);
				elem.data('interval',playInterval);
			};
			function stop() {
				clearInterval(elem.data('interval'));
			};
			function pause() {
				if(option.pause) {
					clearTimeout(elem.data('pause'));
					clearInterval(elem.data('interval'));
					pauseTimeout=setTimeout(function () {
						clearTimeout(elem.data('pause'));
						playInterval=setInterval(function () {
							animate("next",effect);
						},option.play);
						elem.data('interval',playInterval);
					},option.pause);
					elem.data('pause',pauseTimeout);
				}else {
					stop();
				}
			};
			function animate(direction,effect,clicked) {
				if(!active&&loaded) {
					active=true;
					switch(direction) {
						case 'next':prev=current;
						next=current+1;
						next=total===next?0:next;
						position=width*2;
						direction=-width*2;
						current=next;
						break;
						case 'prev':prev=current;
						next=current-1;
						next=next===-1?total-1:next;
						position=0;
						direction=0;
						current=next;
						break;
						case 'pagination':next=parseInt(clicked,10);
						prev=$('.'+option.paginationClass+' td.on a',elem).attr('rel');
						if(next>prev) {
							position=width*2;
							direction=-width*2;
						}else {
							position=0;
							direction=0;
						}
						current=next;
						break;
					}
					if(effect==='fade') {
						option.animationStart();
						if(option.crossfade) {
							control.children(':eq('+next+')',elem).css({
								zIndex:10
							}).fadeIn(option.fadeSpeed,function () {
								control.children(':eq('+prev+')',elem).css({
									display:'none',zIndex:0
								});
								$(this).css({
									zIndex:0
								});
								option.animationComplete(next+1);
								active=false;
							});
						}else {
							option.animationStart();
							control.children(':eq('+prev+')',elem).fadeOut(option.fadeSpeed,function () {
								if(option.autoHeight) {
									control.animate({
										height:control.children(':eq('+next+')',elem).outerHeight()
									},option.autoHeightSpeed,function () {
										control.children(':eq('+next+')',elem).fadeIn(option.fadeSpeed);
									});
								}else {
									control.children(':eq('+next+')',elem).fadeIn(option.fadeSpeed,function () {
										if($.browser.msie) {
											$(this).get(0).style.removeAttribute('filter');
										}
									});
								}
								option.animationComplete(next+1);
								active=false;
							});
						}
					}else {
						control.children(':eq('+next+')').css({
							left:position,display:'block'
						});
						if(option.autoHeight) {
							option.animationStart();
							control.animate({
								left:direction,height:control.children(':eq('+next+')').outerHeight()
							},option.slideSpeed,function () {
								control.css({
									left:-width
								});
								control.children(':eq('+next+')').css({
									left:width,zIndex:5
								});
								control.children(':eq('+prev+')').css({
									left:width,display:'none',zIndex:0
								});
								option.animationComplete(next+1);
								active=false;
							});
						}else {
							option.animationStart();
							control.animate({
								left:direction
							},option.slideSpeed,function () {
								control.css({
									left:-width
								});
								control.children(':eq('+next+')').css({
									left:width,zIndex:5
								});
								control.children(':eq('+prev+')').css({
									left:width,display:'none',zIndex:0
								});
								option.animationComplete(next+1);
								active=false;
							});
						}
					}
					if(option.pagination) {
						$('.'+option.paginationClass+' td.on',elem).removeClass('on');
						$('.'+option.paginationClass+' td a:eq('+next+')',elem).parent().addClass('on');
					}
				}
			};
		});
	};
	$.fn.slides.option={
		preload:false,preloadImage:'images/loading.gif',container:'img_showBoxW > div',generateNextPrev:false,next:'next',prev:'prev',pagination:true,generatePagination:true,paginationClass:'pagination',fadeSpeed:350,slideSpeed:350,effect:'slide',crossfade:false,randomize:false,play:0,pause:0,hoverPause:false,autoHeight:false,autoHeightSpeed:350,bigTarget:false,animationStart:function () {
		},animationComplete:function () {
		}
	};
	$.fn.randomize=function (callback) {
		function randomizeOrder() {
			return (Math.round(Math.random())-0.5);
		}
		return ($(this).each(function () {
			var $this=$(this);
			var $children=$this.children();
			var childCount=$children.length;
			if(childCount>1) {
				$children.hide();
				var indices=[];
				for(i=0;i<childCount;i++) {
					indices[indices.length]=i;
				}
				indices=indices.sort(randomizeOrder);
				$.each(indices,function (j,k) {
					var $child=$children.eq(k);
					var $clone=$child.clone(true);
					$clone.show().appendTo($this);
					if(callback!==undefined) {
						callback($child,$clone);
					}
					$child.remove();
				});
			}
		}));
	};
})(jQuery);
